package com.ly.hotel.util;


import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.widget.ImageView;

import com.ly.hotel.R;
import com.ly.hotel.common.Constants;
import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.ImageLoader;
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.assist.QueueProcessingType;
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer;
import com.nostra13.universalimageloader.core.download.BaseImageDownloader;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;

/**
 * @author jouson
 * 2014-7-4
 */
public class ImageUtil {

	private static boolean isInit = false;
	private static int round = 15;
	
	static {
	}
	
	//常规设置
	private static DisplayImageOptions normalOptions = new DisplayImageOptions.Builder().
			showImageOnLoading(R.drawable.pre_icon) //设置图片在下载期间显示的图片
			.showImageForEmptyUri(R.drawable.pre_icon)//设置图片Uri为空或是错误的时候显示的图片
			.showImageOnFail(R.drawable.pre_icon)  //设置图片加载/解码过程中错误时候显示的图片
			.cacheInMemory(true)//设置下载的图片是否缓存在内存中
			.cacheOnDisk(false)//设置下载的图片是否缓存在SD卡中
//			.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示  
			.bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型//  
			//.delayBeforeLoading(int delayInMillis)//int delayInMillis为你设置的下载前的延迟时间
			//设置图片加入缓存前，对bitmap进行设置  
			//.preProcessor(BitmapProcessor preProcessor)  
			.resetViewBeforeLoading(false)//设置图片在下载前是否重置，复位
	//		.displayer(new RoundedBitmapDisplayer(20))//是否设置为圆角，弧度为多少  
//			.displayer(new FadeInBitmapDisplayer(100))//是否图片加载好后渐入的动画时间  
			.imageScaleType(ImageScaleType.IN_SAMPLE_INT)
			.build();//构建完成  
	
	
	//常规设置
	private static DisplayImageOptions RoundedOptions = new DisplayImageOptions.Builder().
			showImageOnLoading(R.drawable.pre_icon) //设置图片在下载期间显示的图片
			.showImageForEmptyUri(R.drawable.pre_icon)//设置图片Uri为空或是错误的时候显示的图片
			.showImageOnFail(R.drawable.pre_icon)  //设置图片加载/解码过程中错误时候显示的图片
			.cacheInMemory(true)//设置下载的图片是否缓存在内存中
			.cacheOnDisk(false)//设置下载的图片是否缓存在SD卡中
//			.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示  
			.bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型//  
			//.delayBeforeLoading(int delayInMillis)//int delayInMillis为你设置的下载前的延迟时间
			//设置图片加入缓存前，对bitmap进行设置  
			//.preProcessor(BitmapProcessor preProcessor)  
			.resetViewBeforeLoading(false)//设置图片在下载前是否重置，复位
			.displayer(new RoundedBitmapDisplayer(round))//是否设置为圆角，弧度为多少
			.build();//构建完成  
	
	private ImageUtil() {
	}
	
	public static Bitmap loadImage(Context context, String uri) {
		initImageLoader(context);
		return ImageLoader.getInstance().loadImageSync(uri, normalOptions);
	}
	
	//圆角
	public static void displayImage_Round(Context context, String uri, ImageView imageView,int rod) {
		initImageLoader(context);
		ImageLoader.getInstance().displayImage(uri, imageView, new DisplayImageOptions.Builder().
				showImageOnLoading(R.drawable.pre_icon) //设置图片在下载期间显示的图片
				.showImageForEmptyUri(R.drawable.pre_icon)//设置图片Uri为空或是错误的时候显示的图片
				.showImageOnFail(R.drawable.pre_icon)  //设置图片加载/解码过程中错误时候显示的图片
				.cacheInMemory(true)//设置下载的图片是否缓存在内存中
				.cacheOnDisk(false)//设置下载的图片是否缓存在SD卡中
//			.imageScaleType(ImageScaleType.EXACTLY_STRETCHED)//设置图片以如何的编码方式显示
				.bitmapConfig(Bitmap.Config.RGB_565)//设置图片的解码类型//
//				.delayBeforeLoading(300)//int delayInMillis为你设置的下载前的延迟时间
				//设置图片加入缓存前，对bitmap进行设置
				//.preProcessor(BitmapProcessor preProcessor)
				.resetViewBeforeLoading(false)//设置图片在下载前是否重置，复位
				.displayer(new RoundedBitmapDisplayer(rod))//是否设置为圆角，弧度为多少
				.build());
	}
	
	public static void displayImage(Context context, String uri, ImageView imageView) {
		initImageLoader(context);
		ImageLoader.getInstance().displayImage(uri, imageView, normalOptions);
	}
	
	public static void displayImage(Context context, String uri, ImageView imageView, DisplayImageOptions options) {
		initImageLoader(context);
		ImageLoader.getInstance().displayImage(uri, imageView, options);
	}
	
	public static void displayImage(Context context, String uri, ImageView imageView, ImageLoadingListener listener) {
		initImageLoader(context);
		ImageLoader.getInstance().displayImage(uri, imageView, normalOptions, listener);
	}
	
	private static synchronized void initImageLoader(Context context) {
		if (isInit) {
			//Logger.i("已经....初始化imgloader");
			return;
		}
		Context appContext = context.getApplicationContext();
//		File cacheDir = StorageUtils.getOwnCacheDirectory(appContext, "imageloader/Cache");  
		ImageLoaderConfiguration config = new ImageLoaderConfiguration  
			    .Builder(appContext)  
			    .memoryCacheExtraOptions(800, 600) // max width, max height，即保存的每个缓存文件的最大长宽
			   // .discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null) // Can slow ImageLoader, use it carefully (Better don't use it)/设置缓存的详细信息，最好不要设置这个  
			    .threadPoolSize(5)//线程池内加载的数量  
			    .threadPriority(Thread.NORM_PRIORITY - 2)  
			    .denyCacheImageMultipleSizesInMemory()  
//			    .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024)) // You can pass your own memory cache implementation/你可以通过自己的内存缓存实现  
			    .memoryCacheSize(30 * 1024 * 1024) //内存缓存大小
			    .diskCacheSize(50 * 1024 * 1024)  //文件缓存大小
			    .discCache(new UnlimitedDiscCache(new File(Constants.IMAGE_CACHE_FILE_PATH)))//自定义缓存路径 
			    //.discCacheFileNameGenerator(new Md5FileNameGenerator())//将保存的时候的URI名称用MD5 加密  
			    .tasksProcessingOrder(QueueProcessingType.FIFO)  
//			    .diskCacheFileCount(100) //缓存的文件数量  
//			    .diskCache(new UnlimitedDiscCache(cacheDir))//自定义缓存路径  
			    .defaultDisplayImageOptions(DisplayImageOptions.createSimple())  
			    .imageDownloader(new BaseImageDownloader(appContext, 10 * 1000, 30 * 1000)) // connectTimeout (5 s), readTimeout (30 s)超时时间  
			    //.writeDebugLogs() // Remove for release app   
			    .build();//开始构建  
		ImageLoader.getInstance().init(config);
		isInit = true;
	}
	
	/** 保存方法 */
	public static void saveBitmap(Bitmap bm, String path) {
		File f_folder = new File(Constants.CUSTOM_FILE_ROOT);
		File f = new File(path);

		// 检测目录是否存在，没有就新建之
		if (!f_folder.exists()) {
			f_folder.mkdirs();
		}

		if (f.exists()) {
			f.delete();
		}

		try {
			FileOutputStream out = new FileOutputStream(f);
			bm.compress(Bitmap.CompressFormat.PNG, 100, out);
			out.flush();
			out.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		Log.i("imageUtil", path + ",文件size=" + f.length());
	}

}
